package ar.edu.utn.frba.disenio;

import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.Collection;
import ar.edu.utn.frba.disenio.aerolineas.Aerolineas;
import ar.edu.utn.frba.disenio.tipousuarios.TipoUsuario;
 
public class Usuario {
	private Integer dni;
	private TipoUsuario tipo;
	private Aerolineas aerolineas;
	private BigDecimal comprasAcumuladas = new BigDecimal(0);
	private Collection<Busqueda> busquedasRealizadas = new ArrayList<Busqueda>();

	
	public Usuario(Integer dni, TipoUsuario tipo,Aerolineas aerolineas){
		this.setDni(dni);
		this.tipo = tipo;
		this.setAerolineas(aerolineas);
	}

	public Collection<Vuelo> buscarVuelos(Busqueda busqueda)
	{
		this.agregarBusqueda(busqueda);
		return busqueda.buscarVuelos(this.getAerolineas(),this);		
	}
	
	public void reservarVuelo(Vuelo vuelo)
	{
		for(Asiento asiento : vuelo.getAsientos())
		{
			asiento.getAerolinea().reservarAsiento(this,asiento);
		}
	}
	
	public void comprarVuelo(Vuelo vuelo)
	{
		for(Asiento asiento : vuelo.getAsientos())
		{
			asiento.getAerolinea().comprarAsiento(this,asiento);
			this.getAerolineas().actualizarVuelosComprados(asiento.getCodigoVuelo());
			this.tipo.sumarCompra(this,asiento.getPrecio());
		}
	}
	
	public void cancelarReserva(Vuelo vuelo)
	{
		for(Asiento asiento : vuelo.getAsientos())
		{
			asiento.getAerolinea().cancelarReserva(asiento, this);
		}
	}
	
	public boolean puedeComprar(Asiento asiento) {
		return this.tipo.puedeComprar(asiento);
	}

	public void agregarBusqueda(Busqueda busqueda){
		this.getBusquedasRealizadas().add(busqueda);
	}
	
	public void setTipo(TipoUsuario tipo) {
		this.tipo = tipo;
	}
	
	public TipoUsuario getTipo(){
		return this.tipo;
	}
	
	public BigDecimal getComprasAcumuladas() {
		return comprasAcumuladas;
	}
	
	public BigDecimal getAdicionalPorTipo() {
		return this.tipo.getImporteAdicional();
	}

	public void setComprasAcumuladas(BigDecimal comprasAcumuladas) {
		this.comprasAcumuladas = comprasAcumuladas;
	}

	public Collection<Busqueda> getBusquedasRealizadas() {
		return busquedasRealizadas;
	}

	public void setBusquedasRealizadas(Collection<Busqueda> busquedasRealizadas) {
		this.busquedasRealizadas = busquedasRealizadas;
	}

	public Integer getDni() {
		return dni;
	}

	public void setDni(Integer dni) {
		this.dni = dni;
	}

	public Aerolineas getAerolineas() {
		return aerolineas;
	}

	public void setAerolineas(Aerolineas aerolineas) {
		this.aerolineas = aerolineas;
	}
	
}